/**
 * GET 请求在Header中添加
 * @param {String} action 不包含主机域名的URL
 * @param {JSON} header 请求头，包含参数，若无需参数请使用其他版本的get函数
 * @param {Function} funSuccess 请求成功的回调
 * @param {Function} funComplete 请求结束的回调,若无需处理则传空方法体
 */

function getWithParams(action, header, funSuccess, funComplete = () => {}) {
	uni.showLoading({
		title: '加载中',
		mask: false
	});
	uni.request({
		url: action,
		method: 'GET',
		header,
		sslVerify: false,
		success: res => {
			funSuccess(res)
		},
		fail: (err) => {
			console.log("@@getWithParams", err)
		},
		complete: () => {
			uni.hideLoading()
			funComplete()
		}
	});

}
/**
 * 无参的get请求
 * @param {Object} url 不包含主机域名的URL
 * @param {Object} funSuccess 请求成功的回调
 * @param {Object} funComplete 请求结束的回调,若无需处理则传空方法体
 */
function get(url, funSuccess, funComplete = () => {}) {
	uni.showLoading({
		title: '加载中',
		mask: false
	});
	uni.request({
		url,
		method: 'GET',
		header: {
			"content-type": "application/json;charset=UTF-8",
		},
		sslVerify: false,
		success: res => {
			funSuccess(res)
		},
		fail: (err) => {
			console.log("@@get", err)
		},
		complete: () => {
			uni.hideLoading()
			funComplete()
		}
	});
}

/**
 * from post 请求
 * @param {Object} url 不包含主机域名的URL
 * @param {JSON} data 提交的参数
 * @param {Object} funSuccess 请求成功的回调
 * @param {Object} funComplete 请求结束的回调,若无需处理则传空方法体
 */
function postParams(url, data, funSuccess, funComplete = () => {}) {
	uni.showLoading({
		title: '提交',
		mask: false
	});
	uni.request({
		url,
		method: 'POST',
		data,
		header: {
			"accept": "application/json,*/*;q=0",
			"content-type": "application/x-www-form-urlencoded;charset=UTF-8",
		},
		success: res => {
			funSuccess(res)
		},
		fail: (err) => {
			console.log("@@postParams", err)
		},
		complete: () => {
			uni.hideLoading()
			funComplete()
		}
	})
}

/**
 * requestbody post
 * @param {String} url url地址
 * @param {JSON} data 要传递的参数
 * @param {Function} funSuccess 亲求成功的回调
 * @param {Function} funComplete 请求结束的回调，若无需处理则传空方法体        
 */
function post(url, data, funSuccess, funComplete = () => {}) {
	uni.showLoading({
		title: '提交',
		mask: false
	});
	uni.request({
		url: url,
		header: {
			"content-type": "application/json;charset=UTF-8",
		},
		method: 'POST',
		data: data,
		sslVerify: false,
		success: res => {
			funSuccess(res.data)
		},
		fail: () => {},
		complete: () => {
			uni.hideLoading()
			funComplete()
		}
	});
}

/**
 * 上传文件
 * @param {String} url 服务器地址
 * @param {String} param 表单提交的name名称
 * @param {String} filePath 要上传的本地文件路径
 * @param {Json} data 其他同时提交的表单参数，无表单参数则传{}
 * @param {Function} funSucces 成功的回调
 * @param {Function} funComplete 结束的回调，带默认参数不需要可不传
 */
function postFile(url, param, filePath, data, funSucces, funComplete = () => {}) {
	uni.showLoading({
		title: '提交中......',
		mask: false
	});
	uni.uploadFile({
		url: url,
		sslVerify: false,
		filePath: filePath,
		name: param,
		formData: data,
		success: (res) => {
			funSucces(res)
		},
		fail(err) {
			console.log(err);
		},
		complete() {
			uni.hideLoading()
			funComplete()
		}
	})
}

/**
 * 以同步写法实现异步请求，在镶套请求时，async块内部代码是同步的，会等待await代码行的执行结果
 * 注意lambda表达式内使用时，async应在匿名函名函数参数前（需要加括号）
 * @param {String} url 请求地址
 * @param {JSON} data 请求参数，默认是{}，无参数则不需填
 * @param {String} method 请求方法，默认为GET，其他类型按需填写  
 */
function request(url, data = {}, method = 'GET') {
	return new Promise((resovle, reject) => {
		uni.request({
			url,
			method,
			data,
			success: res => {
				resovle(res.data)
			},
			fail: err => {
				reject(err)
			}
		});
	})
}

/**
 * 带参数的删除
 * @param {String} url 接口地址
 * @param {JSON} data 请求参数
 * @param {Function} funSuccess 成功的回调
 */
function deleteParams(url, data, funSuccess) {
	uni.request({
		url,
		method: 'DELETE',
		data,
		header: {
			"content-type": "application/x-www-form-urlencoded;charset=UTF-8"
		},
		success: res => {
			funSuccess(res.data)
		},
		fail: err => {
			console.log(err);
		},
		complete: () => {}
	});
}

function getParams(url, data, funSuccess) {
	uni.request({
		url,
		method: 'GET',
		data: data,
		header: {
			"content-type": "application/x-www-form-urlencoded;charset=UTF-8",
		},
		success: res => {
			funSuccess(res.data)
		},
		fail: err => {
			console.log(err);
		},
		complete: () => {}
	})
}

module.exports = {
	getWithParams,
	get,
	postParams,
	post,
	postFile,
	request,
	deleteParams,
	getParams
}
